package com.orange.common.threadpool.util;

import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @Description:----自定义线程池停止工具
 * 如果你想让线程池优雅的关闭，那么可以使用这个工具类
 */
public class ThreadPoolStopUtils {
    /*
     * @Description:----自定义线程池停止方法
     * 如果你想要优雅的关闭线程池，那么可以使用这个方法，这个方法会先尝试调用shutdown()方法并给一点时间关闭，若在此时间内
     * 线程池还没有被关闭，那么直接强制关闭线程池，如果在强制关闭线程池后过了一段时间线程池还是没有关闭，那么直接抛出异常
     */
    public static void threadPoolStop(ExecutorService threadPool, long shutdownTime, TimeUnit unit){
       //创建一个线程用于关闭线程池
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    //尝试关闭
                    threadPool.shutdown();
                    //等待一段时间，看线程池是否关闭
                    Thread.sleep(unit.toMillis(shutdownTime));
                    if (!threadPool.isShutdown()){
                        System.out.println(threadPool.toString()+"threadPoolStopUtils类的中线程池并没有被关闭!");
                        //直接强制关闭线程池
                        List<Runnable> runnables = threadPool.shutdownNow();
                        System.out.println(runnables.toString()+"threadPoolStopUtils类的中线程池被强制关闭了!,这些是一些属性");
                    }
                    //等待一段时间
                    Thread.sleep(unit.toMillis(shutdownTime));
                    if(!threadPool.isShutdown()){
                        //记录日志，确实是出问题了
                        System.out.println(threadPool.toString()+"该线程池出大问题了");
                    }
                }catch (InterruptedException e){
                    System.out.println("threadPoolStopUtils类的中线程池关闭时发生异常");
                }
            }
        });
        thread.run();
    }

}
